package org.example.flea_market_mvc.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.example.flea_market_mvc.entity.Products;
import org.example.flea_market_mvc.param.ProductParam;

import java.util.List;

/**
 * 商品Mapper接口，提供商品相关的数据库操作方法
 */
@Mapper
public interface ProductsMapper {

    /**
     * 插入一条商品记录
     * @param products 商品实体对象
     * @return 插入成功返回1，失败返回0
     */
    int insert(Products products);

    /**
     * 根据商品ID删除商品记录
     * @param id 商品ID
     * @return 删除成功返回1，失败返回0
     */
    int deleteById(Integer id);

    /**
     * 更新商品记录
     * @param products 商品实体对象，包含要更新的信息
     * @return 更新成功返回1，失败返回0
     */
    int update(Products products);

    /**
     * 根据商品ID查询商品记录
     * @param id 商品ID
     * @return 商品实体对象，如果未找到则返回null
     */
    Products selectById(Integer id);

    /**
     * 查询所有商品记录
     * @return 商品记录列表
     */
    List<Products> selectAll();

    /**
     * 分页查询商品
     * @param offset 偏移量
     * @param pageSize 每页数量
     * @return 商品列表
     */
    List<Products> selectByPage(@Param("offset") int offset, @Param("pageSize") int pageSize);

    /**
     * 查询商品总数
     * @return 商品总数
     */
    int selectCount();

    /**
     * 按分类分页查询商品
     * @param categoryId 分类ID
     * @param offset 偏移量
     * @param pageSize 每页数量
     * @return 商品列表
     */
    List<Products> selectByCategory(@Param("categoryId") int categoryId,
                                  @Param("offset") int offset,
                                  @Param("pageSize") int pageSize);

    /**
     * 查询分类商品总数
     * @param categoryId 分类ID
     * @return 商品总数
     */
    int selectCountByCategory(@Param("categoryId") int categoryId);

    /**
     * 条件分页查询商品
     */
    List<Products> selectPageByParam(ProductParam param, int offset, int pageSize);

    /**
     * 条件统计商品总数
     */
    int countByParam(ProductParam param);

    /**
     * 更新商品状态（上架、下架、审核、强制下架）
     */
    int updateStatus(@org.apache.ibatis.annotations.Param("id") Integer id, @org.apache.ibatis.annotations.Param("status") Integer status);

    int upDataProductStatus(Integer id, Integer status);


}